package org.agent.aigccore.basic.aop;

import org.agent.aigccore.basic.aop.spec.EventSpec;
import org.agent.aigccore.basic.aop.spec.impl.AuthLoginSpec;
import org.agent.aigccore.basic.aop.spec.impl.UserManageSpecs;

/**
 * 复合事件枚举：通过绑定 {@link EventSpec} 类提供强约束与行为。
 * 
 * 设计理念：
 * - 每个事件常量关联一个具体的 {@link EventSpec} 实现类
 * - 通过类约束消除非法组合，确保模块/动作/类型/级别的语义一致性
 * - 支持事件级别的默认标签、校验等扩展行为
 * 
 * 使用方式：
 * <pre>{@code
 * @OpLog(event = OpsEvent.AUTH_LOGIN)
 * public ResponseEntity<Response<TokenVO>> login(@RequestBody LoginRequestDTO dto) { ... }
 * }</pre>
 * 
 * 扩展说明：
 * - 新增事件：在对应包下创建 {@link EventSpec} 实现类，在此枚举中添加常量
 * - specClass 字段保留以备将来容器化实例化或元信息查询
 */
public enum OpsEvent {
    // AUTH
    AUTH_LOGIN(AuthLoginSpec.class),

    // USER_MANAGE
    USER_CREATE(UserManageSpecs.Create.class),
    USER_DELETE(UserManageSpecs.Delete.class),
    USER_UPDATE(UserManageSpecs.Update.class),
    USER_SEARCH(UserManageSpecs.Search.class),
    USER_RESET_PASSWORD(UserManageSpecs.ResetPassword.class),

    ;

    private final Class<? extends EventSpec> specClass;
    private final EventSpec spec;

    OpsEvent(Class<? extends EventSpec> specClass) {
        this.specClass = specClass;
        this.spec = instantiate(specClass);
    }

    public EventSpec getSpec() { return spec; }

    private static EventSpec instantiate(Class<? extends EventSpec> c) {
        try {
            return c.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new IllegalStateException("Bad EventSpec: " + c, e);
        }
    }
}


